package ctr.eleve;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JRadioButton;

import jdbc.Connexion;
import metier.CategorieStage;
import metier.Eleve;
import metier.Grade;
import metier.Stage;
import metier.jdbc.eleve.EleveJdbc;
import metier.jdbc.grade.GradeJdbc;
import metier.jdbc.stage.StageJdbc;
import vue.MenuControle;
import vue.commun.JPanJTable;
import vue.commun.JPanOptionTri;
import vue.eleve.JPanAffStageEleve;
import vue.stage.JPanAffStage;
import configuration.Constante;
import configuration.MessageAppli;
import ctr.commun.CommunGest;

public class GestAfficherStageEleve implements ActionListener{

	private JPanAffStageEleve jPanAffStageEleve;
	private JPanOptionTri jPanOptionTri;
	private Vector<Object> nomColonne= new Vector<Object>(Arrays.asList(new String[] {"grade", "nom", "prenom", "date de naissance", "moyenne", "fonction"}));
	
	/**
	 * Constructeur permettant d'avoir accès au jPan pour acceder à la comboBox.
	 * @param jPanSuppStage
	 */
	public GestAfficherStageEleve(JPanAffStageEleve jPanAffStageEleve, JPanOptionTri jPanOptionTri) {
		this.jPanAffStageEleve = jPanAffStageEleve;
		this.jPanOptionTri = jPanOptionTri;
	}
	@Override
	public void actionPerformed(ActionEvent actionEvent) {
		
		// Test la provenance de l'action.
		if (actionEvent.getSource() instanceof JButton) {
			afficher();
		}else if (actionEvent.getSource() instanceof JRadioButton) {
			triTableau();
		}
	}
	
	/**
	 * Permet de gerer l'affichage des eleves / stages 
	 */
	public void afficher(){
		JPanJTable jTable = null;
		//valeurs des lignes
		Vector<Vector<Object>> dataVector= new Vector<Vector<Object>>();
		
		// Recuperation  des categorie stage et années.
		CategorieStage catStage = (CategorieStage)jPanOptionTri.getjComboBox().getSelectedItem();
		String annee = jPanOptionTri.getjTfAnnee().getText();
		
		try {
			if (annee != null && !annee.matches(Constante.REGEX_4_NUMERIQUE)) {
				throw new Exception(MessageAppli.MSG_CHAMPS_NUM_4);
			}
			
			// Recuperation du stage correspondant.
			Stage stage = StageJdbc.rechercherStageByNom(Connexion.getConnexion(), annee.subSequence(2, 4) + "-" + catStage.getLibelleCat());
			
			if ( stage != null ){
				// Rechercher des eleves.
				CommunGest communGest = new CommunGest();
				ArrayList<Eleve> lEleves = communGest.getListeEleve(stage);
				
				if ( lEleves != null && !lEleves.isEmpty()){
					for (Eleve eleve : lEleves) {
						dataVector.add(eleve.getVector());
					}
				}
				if ( jPanAffStageEleve.getPanJTable() != null ){
					jPanAffStageEleve.getPanJTable().getDefaultTableModel().getDataVector().clear();
					jPanAffStageEleve.getPanJTable().getDefaultTableModel().setDataVector(dataVector, nomColonne);
					MenuControle.afficherPan(jPanAffStageEleve);
				}else{
					jTable = new JPanJTable(null, dataVector, nomColonne, null);
					jTable.setAutoscrolls(true);
					// On affiche la listes des eleves.
					MenuControle.afficherPan(new JPanAffStage(jPanOptionTri, jTable));
				}
			}else{
				throw new Exception(MessageAppli.MSG_STAGE_NON_TROUVE);
			}
		} catch (Exception e) {
			e.printStackTrace();
			JOptionPane.showMessageDialog(jPanAffStageEleve, e.getMessage(), MessageAppli.MSG_TITRE_ERREUR_SAISIE,
					JOptionPane.WARNING_MESSAGE);
		}
	}
	
	/**
	 * Tri le tableau
	 */
	@SuppressWarnings("unchecked")
	private void triTableau(){
		
		Vector<Vector<Object>> dataVector = jPanAffStageEleve.getPanJTable().getDefaultTableModel().getDataVector();
		ArrayList<Eleve> lEleve = new ArrayList<Eleve>();
		// Conversion de la liste de datavector en arrayList pour le tri
		SimpleDateFormat sdf = new SimpleDateFormat(Constante.FORMAT_DATE_SHORT);
		try {
			for (Object object : dataVector) {
				Vector<Object> objetEleve = (Vector<Object>) object;
				// "grade", "nom", "prenom", "date de naissance"
				Grade grade = GradeJdbc.getGradeByAbrev(Connexion.getConnexion(), objetEleve.get(0).toString());
				Eleve chercher = new Eleve(null, 
						objetEleve.get(1).toString(),
						objetEleve.get(2).toString(),
						sdf.parse(objetEleve.get(3).toString()),
						grade.getIdGrade(),
						null,
						null
						);
				chercher = EleveJdbc.rechercherEleve(Connexion.getConnexion(), chercher);
				lEleve.add(chercher);
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		// Selecteur de tri
		if ( jPanOptionTri.getjRbNom().isSelected() ){
			Eleve.setTri(Constante.TRI_ELEVE_NOM);
			jPanOptionTri.getjRbTriDecroissantPrecedent().setSelected(false);
		}
		if ( jPanOptionTri.getjRbPrenom().isSelected()){
			Eleve.setTri(Constante.TRI_ELEVE_PRENOM);
			jPanOptionTri.getjRbTriDecroissantPrecedent().setSelected(false);
		}
		if ( jPanOptionTri.getjRbDateNaissance().isSelected()){
			Eleve.setTri(Constante.TRI_ELEVE_DATE_NAISS);
			jPanOptionTri.getjRbTriDecroissantPrecedent().setSelected(false);
		}
		if ( jPanOptionTri.getjRbgrade().isSelected()){
			Eleve.setTri(Constante.TRI_ELEVE_GRADE);
			jPanOptionTri.getjRbTriDecroissantPrecedent().setSelected(false);
		}
		if ( jPanOptionTri.getjRbMoyenne().isSelected()){
			Eleve.setTri(Constante.TRI_ELEVE_MOYENNE);
			jPanOptionTri.getjRbTriDecroissantPrecedent().setSelected(false);
		}
		
		// Tri Ordonne ou pas
		if ( jPanOptionTri.getjRbTriCroissant().isSelected() ){
			Collections.sort(lEleve);
			jPanOptionTri.getjRbTriDecroissantPrecedent().setSelected(false);
		}
		if ( jPanOptionTri.getjRbTriDecroissant().isSelected() && !jPanOptionTri.getjRbTriDecroissantPrecedent().isSelected() ){
			Collections.reverse(lEleve);
			jPanOptionTri.getjRbTriDecroissantPrecedent().setSelected(true);
		}
		
		jPanAffStageEleve.getPanJTable().getDefaultTableModel().getDataVector().clear();
		//on reaffecte le liste de  datavector
		for (Eleve eleve : lEleve) {
			// construire un vector representant le stage et l'ajouter au dataVector
			dataVector.add(eleve.getVector());
		}
		jPanAffStageEleve.getPanJTable().getDefaultTableModel().setDataVector(dataVector, nomColonne);
		MenuControle.afficherPan(jPanAffStageEleve);
	}
}